package work.thread_eg.concurrent.synchronized_eg;

import java.util.concurrent.TimeUnit;

/**
 * 模拟账户
 * synchronized方法和非synchronized方法是可以同时运行的
 *
 * 这里的synchronized 是本身对象作为锁
 */
public class Account {
    String name;
    double balance;

    public synchronized void set(String name , double balance) {
        this.name = name;
        try {
            Thread.sleep(2000);
        }catch (InterruptedException ex) {
            ex.printStackTrace();
        }
        this.balance = balance;
    }

    /**
     * synchronized
     * 这里如果不加synchronized关键字 表示在副线程运行set方法的时候 主线程可以运行get方法的
     * 加了synchronized之后 线程运行set方法的时候 主线程拿不到a这个对象的锁 所以getBalance要等待set跑完
     * @return
     */
    public synchronized double getBalance() {
        return this.balance;
    }

    public static void main(String[] args) {
        Account a = new Account();
        // a对象是共享对象
        // 主线程和副线程 两个线程争夺资源a
        new Thread(()->a.set("AAA",100.0)).start();

        try {
            TimeUnit.SECONDS.sleep(1);
        }catch (InterruptedException ex) {
            ex.printStackTrace();
        }
        System.out.println(a.getBalance());

        try {
            TimeUnit.SECONDS.sleep(2);
        }catch (InterruptedException ex) {
            ex.printStackTrace();
        }

        System.out.println(a.getBalance());
    }

}
